import 'dart:async';
import 'dart:isolate';

import 'package:demo/config/build_config.dart';
import 'package:demo/provider/view_model/common.dart';
import 'package:demo/provider/widget/base_provider_widget.dart';
import 'package:demo/utils/crash_analysis.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'container/app.dart';

/// 启动项目
void bootApplication() async {
  /// 默认是生产
  BuildConfig.shared.env = HttpEnv.Test;

  /// 这个就是flutter沙箱哨兵，让我们主动handleUncaughtError的时候就会直接到哨兵这里，他可以捕获大部分的异常 越界 nullpoint等等
  /// 在创建appRunner的时候他会注册沙箱，在runner出现的一些异常会直接触发
  runZonedGuarded(
    () async {
      /// 如果在runApp之前你就需要执行某些操作，必须要让胶水类WidgetsFlutterBinding初始化先
      WidgetsFlutterBinding.ensureInitialized();

      /// 平滑滚动以提供不匹配的输入和显示频率
      /// 当输入和显示频率不同时，Flutter团队与Google内部合作伙伴合作，极大地提高了滚动性能。
      /// 例如，Pixel 4输入的运行频率为120hz，而显示屏的运行频率为90hz。滚动时，这种不匹配会导致性能下降。
      /// 使用新的resamplingEnabled标志，您可以利用我们在Flutter中完成的性能工作来解决此问题：
      GestureBinding.instance!.resamplingEnabled = true;

      /// 限制App图片缓存个数 100，默认1000
      PaintingBinding.instance!.imageCache!.maximumSize = 100;

      /// 限制App图片缓存大小 50m， 默认100m
      PaintingBinding.instance!.imageCache!.maximumSizeBytes = 50 << 20;

      /// 初始化一些插件只需要全局注册一次的，在启动时候直接运行,相关如果需要释放依赖的插件需要在app里面注册
      await Future.wait([
        // 强制系统竖屏
        SystemChrome.setPreferredOrientations(
          const <DeviceOrientation>[
            DeviceOrientation.portraitUp,
            DeviceOrientation.portraitDown,
          ],
        ),
        // 初始化bugly
        CrashAnalysisUtils.instance.initBugly()
      ]);

      /// 这里没有使用直接插件封装的原因，是让使用的人知道在flutter中捕获异常是这样的过程
      /// 替换对应的flutter error捕获，比如布局的错误这样
      FlutterError.onError = CrashAnalysisUtils.catchFlutterError;

      /// 在flutter Isolate环境发生异常的捕获
      Isolate.current.addErrorListener(
        RawReceivePort((dynamic pair) => CrashAnalysisUtils.catchFlutterIsolateError).sendPort,
      );

      /// 启动
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider<Common>(create: (_) => Common()),
          ],
          child: App(),
        ),
      );

      /// 配置状态栏的操作
      SystemChrome.setSystemUIOverlayStyle(
        SystemUiOverlayStyle(
          systemNavigationBarColor: Colors.white,
          systemNavigationBarDividerColor: null,
          statusBarColor: Colors.blueAccent,
          systemNavigationBarIconBrightness: Brightness.dark,
          statusBarIconBrightness: Brightness.light,
          statusBarBrightness: Brightness.light,
        ),
      );
    },
    CrashAnalysisUtils.catchZonedGuardedError,
  );
}
